/**
 * 精度处理工具函数
 * 解决 JavaScript 浮点数运算精度问题
 */

/**
 * 精确加法
 * @param num1 第一个数
 * @param num2 第二个数
 * @returns 精确的加法结果
 */
export const precisionAdd = (num1: number, num2: number): number => {
  const num1Digits = (num1.toString().split('.')[1] || '').length;
  const num2Digits = (num2.toString().split('.')[1] || '').length;
  const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
  return (Math.round(num1 * baseNum) + Math.round(num2 * baseNum)) / baseNum;
};

/**
 * 精确乘法
 * @param num1 第一个数
 * @param num2 第二个数
 * @returns 精确的乘法结果
 */
export const precisionMultiply = (num1: number, num2: number): number => {
  const num1Digits = (num1.toString().split('.')[1] || '').length;
  const num2Digits = (num2.toString().split('.')[1] || '').length;
  const baseNum = Math.pow(10, num1Digits + num2Digits);
  return (Math.round(num1 * Math.pow(10, num1Digits)) * Math.round(num2 * Math.pow(10, num2Digits))) / baseNum;
};

/**
 * 精确减法
 * @param num1 被减数
 * @param num2 减数
 * @returns 精确的减法结果
 */
export const precisionSubtract = (num1: number, num2: number): number => {
  const num1Digits = (num1.toString().split('.')[1] || '').length;
  const num2Digits = (num2.toString().split('.')[1] || '').length;
  const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
  return (Math.round(num1 * baseNum) - Math.round(num2 * baseNum)) / baseNum;
};

/**
 * 精确除法
 * @param num1 被除数
 * @param num2 除数
 * @returns 精确的除法结果
 */
export const precisionDivide = (num1: number, num2: number): number => {
  const num1Digits = (num1.toString().split('.')[1] || '').length;
  const num2Digits = (num2.toString().split('.')[1] || '').length;
  const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
  return (Math.round(num1 * baseNum) / Math.round(num2 * baseNum));
};

/**
 * 格式化金额，保留两位小数
 * @param amount 金额
 * @returns 格式化后的金额字符串
 */
export const formatAmount = (amount: number): string => {
  return amount.toFixed(2);
};
